// 引入 Qt 所需的各种控件头文件
#include <QApplication>       // Qt 应用程序类
#include <QWidget>            // 所有窗口部件的基类
#include <QFormLayout>        // 表单布局管理器
#include <QLineEdit>          // 单行文本输入框
#include <QTextEdit>          // 多行文本编辑器
#include <QCheckBox>          // 复选框
#include <QRadioButton>       // 单选按钮
#include <QComboBox>          // 下拉选择框
#include <QSpinBox>           // 整数调节器
#include <QDoubleSpinBox>     // 浮点数调节器
#include <QSlider>            // 滑动条
#include <QProgressBar>       // 进度条
#include <QDateEdit>          // 日期选择器
#include <QTimeEdit>          // 时间选择器
#include <QDateTimeEdit>      // 日期时间选择器
#include <QPushButton>        // 普通按钮
#include <QFileDialog>        // 文件选择对话框
#include <QHBoxLayout>        // 水平布局管理器
#include <QVBoxLayout>        // 垂直布局管理器
#include <QLabel>             // 标签控件

int main(int argc, char *argv[])
{
    QApplication app(argc, argv); // 创建应用程序对象

    QWidget window;  // 创建主窗口部件
    window.setWindowTitle("🌟 Qt 所有 Input Widgets 示例");  // 设置窗口标题

    QVBoxLayout *mainLayout = new QVBoxLayout; // 创建主垂直布局

    QFormLayout *formLayout = new QFormLayout; // 创建表单布局用于添加控件

    // 单行文本框（如用户名）
    QLineEdit *lineEdit = new QLineEdit;
    formLayout->addRow("单行文本框:", lineEdit);

    // 密码输入框（隐藏输入）
    QLineEdit *passwordEdit = new QLineEdit;
    passwordEdit->setEchoMode(QLineEdit::Password);
    formLayout->addRow("密码输入框:", passwordEdit);

    // 多行文本框（如备注）
    QTextEdit *textEdit = new QTextEdit;
    textEdit->setPlaceholderText("请输入多行文本...");
    formLayout->addRow("多行文本框:", textEdit);

    // 复选框（如“同意协议”）
    QCheckBox *checkBox = new QCheckBox("我同意协议");
    formLayout->addRow("复选框:", checkBox);

    // 单选框（性别选择）
    QHBoxLayout *radioLayout = new QHBoxLayout;  // 放置单选框的水平布局
    QRadioButton *radioMale = new QRadioButton("男");
    QRadioButton *radioFemale = new QRadioButton("女");
    QRadioButton *radioOther = new QRadioButton("其他");
    radioLayout->addWidget(radioMale);
    radioLayout->addWidget(radioFemale);
    radioLayout->addWidget(radioOther);
    formLayout->addRow("单选框:", radioLayout);  // 添加到表单布局

    // 下拉选择框（国家）
    QComboBox *comboBox = new QComboBox;
    comboBox->addItems({"中国", "美国", "英国", "法国"});
    formLayout->addRow("下拉选择框:", comboBox);

    // 整数调节器（0~100）
    QSpinBox *spinBox = new QSpinBox;
    spinBox->setRange(0, 100);
    formLayout->addRow("整数调节器:", spinBox);

    // 浮点数调节器（0.0~10.0，步长0.1）
    QDoubleSpinBox *doubleSpinBox = new QDoubleSpinBox;
    doubleSpinBox->setRange(0, 10);
    doubleSpinBox->setSingleStep(0.1);
    formLayout->addRow("浮点数调节器:", doubleSpinBox);

    // 水平滑动条
    QSlider *slider = new QSlider(Qt::Horizontal);
    slider->setRange(0, 100);
    formLayout->addRow("滑动条:", slider);

    // 进度条（当前值设为50）
    QProgressBar *progressBar = new QProgressBar;
    progressBar->setRange(0, 100);
    progressBar->setValue(50);  // 示例设定为50%
    formLayout->addRow("进度条:", progressBar);

    // 日期选择器（当前日期）
    QDateEdit *dateEdit = new QDateEdit(QDate::currentDate());
    formLayout->addRow("日期选择器:", dateEdit);

    // 时间选择器（当前时间）
    QTimeEdit *timeEdit = new QTimeEdit(QTime::currentTime());
    formLayout->addRow("时间选择器:", timeEdit);

    // 日期时间选择器（当前日期和时间）
    QDateTimeEdit *dateTimeEdit = new QDateTimeEdit(QDateTime::currentDateTime());
    formLayout->addRow("日期时间选择器:", dateTimeEdit);

    // 文件选择按钮 + 显示文件路径的标签
    QPushButton *fileButton = new QPushButton("选择文件...");
    QLabel *filePathLabel = new QLabel("未选择文件");
    QObject::connect(fileButton, &QPushButton::clicked, [&]() {
        QString fileName = QFileDialog::getOpenFileName(&window, "选择文件");
        if (!fileName.isEmpty()) {
            filePathLabel->setText(fileName);  // 更新标签显示路径
        }
    });
    formLayout->addRow("文件选择:", fileButton);     // 按钮行
    formLayout->addRow("", filePathLabel);           // 路径显示行

    mainLayout->addLayout(formLayout);  // 把表单布局添加到主垂直布局中

    // 提交按钮（暂无功能）
    QPushButton *submitBtn = new QPushButton("提交");
    mainLayout->addWidget(submitBtn);   // 添加到主布局底部

    window.setLayout(mainLayout);       // 设置窗口使用的主布局
    window.resize(500, 700);            // 设置窗口初始大小
    window.show();                      // 显示窗口

    return app.exec();                  // 启动 Qt 事件循环
}
